package com.sunday.common.mq.rabbit.brave.aspectj;

import brave.spring.rabbit.TracingRabbitPostProcessor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

/**
 * rabbit aop 添加 brave 链路追踪
 * Tracing、Tracer和Span都是与分布式系统中跟踪请求的相关概念。
 * Tracing（分布式追踪）是一种技术，用于收集并展示分布式系统中跨越多个服务的请求的数据，以便诊断性能问题和故障排除。
 * Tracer（追踪器）是一种库或工具，用于在代码中创建和记录跟踪信息。它通常与分布式追踪系统配合使用，例如Jaeger或Zipkin等。
 * Span（跨度）表示一个操作的时间跨度，例如从发起请求到接收响应的整个时间。Span包含有关操作的信息，例如开始和结束时间戳，持续时间，标签和日志等。Span是组成分布式追踪数据的基本单元。
 *
 * @author zsy
 * @since 2022/10/23
 */
@Slf4j
@Aspect
@RequiredArgsConstructor
public class TracingRabbitAspect {

    final TracingRabbitPostProcessor tracingRabbitPostProcessor;

    @Around("execution (@com.sunday.common.mq.rabbit.brave.annotation.TracingRabbitHandler  * *.*(..))")
    public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
        Throwable error = null;
        try {
            Object response = pjp.proceed();
            return response;
        } catch (Throwable t) {
            error = t;
            throw t;
        } finally {
            tracingRabbitPostProcessor.close(error);
        }
    }
}
